package com.own.component.store.core.util.base;

import java.time.Duration;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;

/**
 * BaseLockMethod
 *
 * @author chenxueli
 * @date 2023-07-21 10:12:00
 */
public interface BaseLockMethod {

    /**
     * 获取锁对象
     *
     * @param key 锁的key
     * @return 锁
     */
    Lock getLock(String key);

    /**
     * 获取锁，如果锁被使用中，会自动等待锁释放后执行
     *
     * @param key 锁的key
     */
    default void lock(String key) {
        getLock(key).lock();
    }

    /**
     * 释放锁
     *
     * @param key 锁的key
     */
    default void release(String key) {
        getLock(key).unlock();
    }

    /**
     * 获取锁
     *
     * @param key 锁的key
     * @return 是否获取到锁
     */
    default boolean tryLock(String key) {
        return getLock(key).tryLock();
    }

    /**
     * 获取锁
     *
     * @param key 锁的key
     * @return 是否获取到锁
     */
    default boolean tryLock(String key, Duration duration) {
        try {
            return getLock(key).tryLock(duration.toMillis(), TimeUnit.MICROSECONDS);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

}
